#include "../../source/http/http.hpp"

// // 长连接测试 -- 创建一个客户端持续给服务器发送数据, 直接超过超时时间看看是否正常
// void TestLongCon(){
//     Socket cli_sock;
//     cli_sock.CreateClient(8080, "127.0.0.1");
//     std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nConttent-Length: 0\r\n\r\n";
//     while(true){
//         if(cli_sock.Send(req.c_str(), req.size()) < 0) break;
//         char buf[1024] = {0};
//         if(cli_sock.Recv(buf, sizeof(buf) - 1) <= 0) break;
//         LOG_DEBUG("[%s]", buf);
//         sleep(30);
//     }

//     cli_sock.Close();
// }

// // 超时连接测试: 在超时时间内发送一次|不发送数据, 看服务器如何处理
// void TestOverTimeConn(){
//     Socket cli_sock;
//     cli_sock.CreateClient(8080, "127.0.0.1");
//     std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nConttent-Length: 0\r\n\r\n";
//     while(true){
//         if(cli_sock.Send(req.c_str(), req.size()) < 0) break;
//         char buf[1024] = {0};
//         if(cli_sock.Recv(buf, sizeof(buf) - 1) <= 0) break;
//         LOG_DEBUG("[%s]", buf);
//         sleep(3);
//     }

//     cli_sock.Close();
// }

// // 给服务器发送一个数据, 告诉服务器要发送 1024 字节， 但是实际发送数据不足 1024, 查看服务器处理结果
//     // 1. 如果数据只发送一次，服务器将得不到完整请求，就不会进行业务处理，客户端也就得不到响应，最终超时关闭连接
//     // 2. 连着给服务器发送了多次 小的请求，  服务器会将后边的请求当作前边请求的正文进行处理，而后便处理的时候有可能就会因为处理错误而关闭连接
// void TestErrorRequest(){
//     Socket cli_sock;
//     cli_sock.CreateClient(8080, "127.0.0.1");
//     std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nConttent-Length: 0\r\n\r\n";
//     while(true){
//         assert(cli_sock.Send(req.c_str(), req.size()) != -1);
//         assert(cli_sock.Send(req.c_str(), req.size()) != -1);
//         assert(cli_sock.Send(req.c_str(), req.size()) != -1);
//         char buf[1024] = {0};

//         assert(cli_sock.Recv(buf, sizeof(buf) - 1));
//         LOG_DEBUG("[%s]", buf);
//         sleep(3);
//     }

//     cli_sock.Close();
// }

// /* 业务处理超时，查看服务器的处理情况
//     当服务器达到了一个性能瓶颈，在一次业务处理中花费了太长的时间（超过了服务器设置的非活跃超时时间）
//      1. 在一次业务处理中耗费太长时间，导致其他的连接也被连累超时，其他的连接有可能会被拖累超时释放
//      假设现在  12345描述符就绪了， 在处理1的时候花费了30s处理完，超时了，导致2345描述符因为长时间没有刷新活跃度
//        1. 如果接下来的2345描述符都是通信连接描述符，如果都就绪了，则并不影响，因为接下来就会进行处理并刷新活跃度
//        2. 如果接下来的2号描述符是定时器事件描述符，定时器触发超时，执行定时任务，就会将345描述符给释放掉
//           这时候一旦345描述符对应的连接被释放，接下来在处理345事件的时候就会导致程序崩溃（内存访问错误）
//           因此这时候，在本次事件处理中，并不能直接对连接进行释放，而应该将释放操作压入到任务池中，
//           等到事件处理完了执行任务池中的任务的时候，再去释放
// */

// void TestOveTimeProcess(){
//     signal(SIGCHLD, SIG_IGN);
//     for (int i = 0; i < 10; i++) {
//         pid_t pid = fork();
//         if (pid < 0) {
//             LOG_DEBUG("FORK ERROR");
//             return ;
//         }else if (pid == 0) {
//             // 子进程创建客户端进行通信
//             Socket cli_sock;
//             cli_sock.CreateClient(8080, "127.0.0.1");
//             std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nConttent-Length: 0\r\n\r\n";
//             while(1) {
//                 assert(cli_sock.Send(req.c_str(), req.size()) != -1);
//                 char buf[1024] = {0};
//                 assert(cli_sock.Recv(buf, 1023));
//                 LOG_DEBUG("[%s]", buf);
//             }
//             cli_sock.Close();
//             exit(0);
//         }
//     }
//     while(1) sleep(1);
// }


// /*一次性给服务器发送多条数据，然后查看服务器的处理结果*/
// /*每一条请求都应该得到正常处理*/
// void TestMulRequest(){
//     Socket cli_sock;
//     cli_sock.CreateClient(8080, "127.0.0.1");
//     std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nConttent-Length: 0\r\n\r\n";
//     req += "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nConttent-Length: 0\r\n\r\n";
//     req += "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nConttent-Length: 0\r\n\r\n";

//     while(true){
//         assert(cli_sock.Send(req.c_str(), req.size()) != -1);
//         char buf[1024] = {0};

//         if(cli_sock.Recv(buf, sizeof(buf) - 1) < 0) break;
//         LOG_DEBUG("[%s]", buf);
//         sleep(3);
//     }

//     cli_sock.Close();
// }

// 大文件传输测试: 给服务器上传一个大文件, 服务器把文件保存下来, 观察处理结果
// 上传文件: 和服务器保存文件一致
void TestBigFile(){
    Socket cli_sock;
    cli_sock.CreateClient(8080, "127.0.0.1");
    std::string head = "PUT /1234.txt HTTP/1.1\r\nConnection: keep-alive\r\n";
    std::string body;
    Util::ReadFile("./hello.txt", &body); // 把 hello.txt 数据读出放入 body

    std::string req = head + "Content-Length" + std::to_string(body.size()) + "\r\n\r\n";

    assert(cli_sock.Send(req.c_str(), req.size()) != -1);
    assert(cli_sock.Send(body.c_str(), body.size()) != -1);
    char buf[1024] = {0};
    assert(cli_sock.Recv(buf, sizeof(buf) - 1));
    LOG_DEBUG("[%s]", buf);
    // DBG_LOG("[%s]", buf);
    sleep(3);

    cli_sock.Close();
}



int main()
{
    TestBigFile();
    return 0;
}